package br.com.dponto.ponto;

import java.util.Date;
import java.util.List;

import br.com.dponto.usuario.Usuario;
import br.com.dponto.util.DAOFactory;
import br.com.dponto.util.DataHoraUtil;

public class PontoRN {

	private PontoDAO pontoDAO;
	private int situacao;

	public PontoRN() {
		this.pontoDAO = DAOFactory.criarPontoDAO();
	}

	public void salvar(Ponto ponto) {
		Integer codigo = ponto.getCodigo();
		if (codigo == null || codigo == 0) {
			this.pontoDAO.salvar(ponto);
		} else {
			this.pontoDAO.alterar(ponto);
		}

	}

	public void excluir(Ponto ponto) {
		this.pontoDAO.excluir(ponto);
	}

	public void calculaHoraExtra(Ponto ponto) {
		DataHoraUtil dataHora = new DataHoraUtil();
		if (ponto.getInicio_almoco() == null) {
			Date zera_hora = dataHora.zerarHora(ponto.getInicio_almoco());
			ponto.setInicio_almoco(zera_hora);
		}
		if (ponto.getFim_almoco() == null) {
			Date zera_hora = dataHora.zerarHora(ponto.getFim_almoco());
			ponto.setFim_almoco(zera_hora);
		}
		if (ponto.getSaida() == null) {
			Date zera_hora = dataHora.zerarHora(ponto.getSaida());
			ponto.setSaida(zera_hora);
		}


	}

	public int baterPonto(Ponto ponto) {
		// VALORES PARA SITUAÇAO 0:sucesso, 1:entre primeiro, 2:já existe,
		// 3:saia para almoço.
		Ponto pontoConsultado = buscarPorData(ponto.getData(),
				ponto.getUsuario());

		if (pontoConsultado == null) {
			if (ponto.getTipo() == 1) {
				salvar(ponto);
				this.situacao = 0;
				return situacao;
			} else {
				this.situacao = 1;
				return situacao;
			}
		} else {
			if (pontoConsultado.getTipo() >= ponto.getTipo()) {
				this.situacao = 2;
				return situacao;
			} else {
				if (ponto.getTipo() == 2) {
					pontoConsultado.setInicio_almoco(ponto.getInicio_almoco());
					pontoConsultado.setTipo(ponto.getTipo());
					salvar(pontoConsultado);
					this.situacao = 0;
					return situacao;
				} else if (ponto.getTipo() == 3) {
					if (pontoConsultado.getTipo() == 2) {
						pontoConsultado.setFim_almoco(ponto.getFim_almoco());
						pontoConsultado.setTipo(ponto.getTipo());
						salvar(pontoConsultado);
						this.situacao = 0;
						return situacao;
					} else {
						this.situacao = 3;
						return situacao;
					}
				} else {
					if (pontoConsultado.getInicio_almoco() == null
							|| pontoConsultado.getFim_almoco() == null) {
						pontoConsultado.setSituacao("Inconcistente");
					}
					pontoConsultado.setSaida(ponto.getSaida());
					pontoConsultado.setTipo(ponto.getTipo());
					pontoConsultado.setSituacao("Normal");
					salvar(pontoConsultado);
					this.situacao = 0;
					return situacao;
				}
			}
		}
	}

	public Ponto buscarPorData(Date data, Usuario usuario) {
		return this.pontoDAO.bucarPorData(data, usuario);

	}

	public List<Ponto> listar(Usuario usuario) {
		return this.pontoDAO.listar(usuario);
	}

}
